PHP代码审计之HadSky |
您所在的位置:网站首页 › php is_a()漏洞 › PHP代码审计之HadSky |
环境搭建: 首先使用phpstudy进行环境搭建,创建网站之后,进入下一 步。 接着进入安装过程。 安装完成之后,输入设置好的密码。进行登录。 代码审计:路由分析该系统使用 puyuetian 自研框架进行开发,我们从页面访问情况可以看到,在功能点调用时总是从index.php开始走的,所以我们先去看看index.php文件内容:index.php中上面是一些环境检测代码,这里包含一个框架加载文件puyuetian.php。 在初始时框架就会加载如缓存、访问控制、框架公用变量等文件,而前台的路由 主要由下面的 laod.php 文件进行控制,跟进该文件 在该文件中通过get传入c参数来控制路由,如果不传入该参数,则默认访问phpscript目录下 main.php,否则包含phpscript目录下相应文件实现相应功能。 而后台路由我们需要访问admin.php,这里的app其实代表app文件夹, superadmin:index则表示superadmin文件夹下的index.php文件,这样路由就定位到该php文件,继续跟进 该文件 在该文件中,在代码中需要传递另一个参数 s 来控制调用后台的某些功能点,以此类推,/app 目录下文件的调用方式就是通过这样来调用的。 1.任意文件写入漏洞全局搜索 file_put_contents( 时,发现这里写入的内容直接可通过POST传参控制 回溯文件,在文件最开始通过传入type参数来控制switch....case来执行我们的 file_get_contents() , 而这里的path也是通过我们GET传入的,只是这里的path参数有realpath() 函数包裹和下面代码进行限制。 需要传入type=save,path是一个存在的文件则可以覆盖该文件将任意内容写入。 通过type=mkfile,并且传入 mkname 参数即可创建文件,这样我们就可以通过创建的文件进行文件内容的写入。 漏洞复现:我们构造路由进行测试, 在这里我们找一个目录下的文件进行测试,代码中是会提示保存失败的, 但是我们后台查看文件已经写入了。 进入本地文件夹,发现成功写入phpinfo 访问看看。 2.任意文件删除漏洞全局搜索 unlink() 函数,经过前面的分析这里的$path我们确定是 可控的,只要该文件存在即可进行删除。 发现该处代码调用过程中没有做过滤。 漏洞复现:进入安装目录下。 使用burpsuite进行抓包。 成功删除新建的文件。 3.任意文件删除导致rce漏洞通过上述文件中任意文件删除漏洞,那么我们就可以删除锁文件(xx.locked)达到重装的效果 看下面的install.php中,最上面接收参数,也就是我们安装时填入的一些数据库信息。 在这里也要保证数据库在执行连接、创建等操作时不报错。如果数据库执行期间报错的话那么就会导致系统安装不成功,后续的config.php即使写入文件也无法利用。 在config.php文件中,在红框中的参数是我们可以“控制"的参数。 在这里mysql_prefix注入特殊字符可以顺利安装,文件内容也会被顺利写入。那么我们该如何执行config.php,接着往下分析 上面config.php文件中我们可知,必须定义了puyuetian常量才可以访问该文件,而我们知道index.php路由文件中包含了框架加载文件puyuetian.php ,而在该文件中包含了config.php文件,也就是说只要我们成功安装系统,再访问index.php的话就可以成功rce了。 漏洞复现:首先在安装界面填入我们payload,这里系统会成功安装。 成功触发phpinfo 4.任意文件读取漏洞全局危险函数 file_get_contents( 。 传入type=edit走到这个分支,这里白名单后缀已经可以满足我们读取大部分文件,path可控。 当我们GET传入json参数时,就会进入ExitJson函数中,该函数的大致意思就是将我们读取到的内容通过 json形式进行回显。 漏洞复现:5.模板上传绕过getshell进入后台的上传功能。 定位到如下代码处 app\superadmin\phpscript\app.php 通过控制 t=uploadapp 参数来控制代码执行此处的else if,其中就是上传zip文件的代码,可以看到这里 代码的后缀白名单,然后通过ZipArchive class(php自带类库,可以对文件进行压缩与解压缩处理 下的open方法打开压缩文件。 然后通过ZipArchive::extractTo()方法将.zip文件解压到根目录。且通过ZipArchive解压文件的骚操作还有很多,这里就使用最简单的方式进行getshell。 下面是ZipArchive Class下的一些常用方法 php中有一个ZipArchive类,可以用于文件的压缩与解压的操作,ZipArchive类的使用教程,可以查看下面的方法。 php ZipArchive类使用方法 1、声明一个 ZipArchive 类的使用方法$zip = new ZipArchive; 2、打开一个压缩文件$zip->open('new.zip', ZipArchive::CREATE); (1)、open 中的第一个参数 'new.zip',是要打开的压缩文件 (2)、open 中的第二个参数,有四个值,可以参考如下ZIPARCHIVE::OVERWRITE:检测zip文件是否存在,如果不存在则会新建,如果存在则会被覆盖 ZIPARCHIVE::CREATE:如果指定的zip文件不存在,则新建一个 ZIPARCHIVE::EXCL:如果指定的zip文件存在,则会报错 ZIPARCHIVE::CHECKCONS:对指定的zip执行其他一致性测试 3、addFile 可以添加文件到压缩包中$zip->addFile('test.txt'); 4、addEmptyDir 添加一个空目录到压缩包中$zip->addEmptyDir ('newdir'); 5、addFromString 添加指定的内容的文件到压缩包中$zip->addFromString('new.txt', '这里是要添加的内容'); 6:extractTO 将压缩包解压到指定文件$zip->extractTo('test'); 7:getNameIndex 根据压缩包内文件索引返回文件名称$zip->getNameIndex(0); 8:getStream 获取压缩包中指定文件的内容$zip->getStream('hello.txt'); 9:renameIndex 修改压缩包中指定索引的文件$zip->renameIndex(0,'newname.txt'); 10:renameName 修改指定文件的名称$zip->renameName('word.txt','newword.txt'); 11:deleteIndex 删除压缩包中指定索引的文件$zip->deleteIndex (0); 12:deleteName 删除压缩包中指定的文件$zip->deleteName('word.txt'); ZipArchive类使用示例 1、php使用 ZipArchive 类压缩文件的方法 2、php使用 ZipArchive 类解压文件的方法 3、php ZipArchive类压缩包操作 漏洞复现:这里我们将我们的php文件进行压缩 REF: https://cri1stur.github.io/2023/02/02/hadsky%E4%BB%A3%E7%A0%81%E5%AE%A1%E8%AE%A1/ https://wx.zsxq.com/dweb2/index/footprint/88455551854122 https://blog.csdn.net/qq_51577576/article/details/121985574 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |